// 校车表
class SchoolBus {
 async getSchoolBusList(place, time,studentID) {
    // 异步函数定义，接收地点、时间、学生ID作为参数
    const bus = await global._db('bus');
    // 从数据库（通过 global._db 访问）获取所有的校车（'bus' 表）数据
    const favoriteBus = await global._db('favoriteBus').where({studentId:studentID});
    // 从数据库获取当前学生（由 studentID 指定）的所有收藏线路（'favoriteBus' 表）数据
    var favoriteBusMap = new Map();
    // 创建一个 Map，用于快速查找某个学生是否收藏了某条线路
    favoriteBus.map(item => {
      const {busNo} = item;
      var str = studentID + "-" + busNo
      // 构建一个唯一的键，结合学生ID和线路编号
      favoriteBusMap.set(str,item.id)
      // 将学生ID-线路编号作为键，收藏记录的ID作为值存入 Map
    });
    const list = [];
    // 初始化一个空数组，用于存放最终筛选和处理后的校车列表
    var favoriteCount = 0
    // 初始化收藏线路计数器
    bus.map(item => {
    // 遍历所有校车数据
      const { id,favorite,busNo,startStation,endStation,startTime} = item;
      // 解构出校车的各个属性
      let havePlace = false
      // 初始化地点筛选标记
      if (place != "") {
      // 如果传入了地点筛选条件（place 不为空）
        let placeArr = place.split(',')
        // 将地点字符串按逗号分割成数组
        for (var i=0;i<placeArr.length;i++) {
          if (item.startStation.indexOf(placeArr[i]) != -1 //||
            //item.endStation.indexOf(placeArr[i]) != -1
            // 检查校车的起始站是否包含筛选地点中的任意一个
            // 被注释掉的部分是检查终点站，目前只检查起始站
            ) {
            havePlace = true
            // 如果匹配，标记为 true 并跳出循环
            break
          }
        }
      } else {
        havePlace = true
        // 如果没有地点筛选条件，则认为地点筛选通过
      }
      if (havePlace === false) {
        return ;
        // 如果地点筛选未通过，跳过当前校车，不将其加入列表
      }
      let haveTime = false
      // 初始化时间筛选标记
      if (time != "") {
      // 如果传入了时间筛选条件（time 不为空）
        let timeArr = time.split(',')
        // 将时间字符串按逗号分割成数组
        for (var i=0;i<timeArr.length;i++) {
          if (getSchoolBusTime(startTime) === timeArr[i]) {
          // 调用 getSchoolBusTime 函数（此函数未在片段中，但根据名字是将发车时间转换为时间段，如“上午”）
          // 检查校车的发车时间段是否匹配筛选时间中的任意一个
            haveTime = true
            // 如果匹配，标记为 true 并跳出循环
            break
          }
        }
      } else {
        haveTime = true
        // 如果没有时间筛选条件，则认为时间筛选通过
      }
      if (haveTime === false) {
        return ;
        // 如果时间筛选未通过，跳过当前校车
      }
      var tempItem = {id,favorite,busNo,startStation,endStation,startTime}
      // 创建一个临时对象，复制校车基本信息
      tempItem.favorite = 0
      tempItem.favoriteId = 0
      // 默认设置收藏标记为 0，收藏ID为 0
      var str = studentID + "-" + busNo
      // 再次构建学生ID-线路编号的键
      if (favoriteBusMap.has(str) === true) {
      // 检查这个键是否存在于之前创建的 favoriteBusMap 中
        tempItem.favorite = 1
        // 如果存在，说明当前学生收藏了这条线路，将收藏标记设置为 1
        tempItem.favoriteId = favoriteBusMap.get(str)
        // 将收藏记录的ID赋值给 favoriteId
        favoriteCount = favoriteCount + 1
        // 收藏计数加一
      }
      list.push(tempItem);
      // 将处理后的校车对象添加到结果列表 list 中
    });
    // 遍历结束
    for(let i=0;i<list.length-1;i++){
      for(let j=i+1;j<list.length;j++){
        if (list[i].favoriteId < list[j].favoriteId) {
        // 这里是冒泡排序，比较的是 favoriteId
        // 如果前一个元素的 favoriteId 小于后一个元素的 favoriteId
        // 由于收藏的 favoriteId 通常是正数且大于0，未收藏的是0，
        // 这个比较条件 (<) 会将 favoriteId 大的（收藏的）向前移动
          let temp = list[i]
          list[i] = list[j]
          list[j] = temp
          // 交换两个元素的位置
        }
      }
    }
    // 排序结束
    const obj = {favoriteCount,list};
    // 将收藏数量和排序后的列表封装成一个对象
    return obj;
    // 返回结果对象
  }

  async getSchoolBusPlaceList() {
    const bus = await global._db('bus');
    const list = [];
    bus.map(item => {
      const { startStation,endStation} = item;
      if (list.indexOf(startStation) === -1) {
        list.push(startStation)
      }
      if (list.indexOf(endStation) === -1) {
        list.push(endStation)
      }
    });
    return list;
  }

  async getSchoolBusDetail(busNo,studentID) {
    const busInfobj = { busNo: busNo };
    const busInfo = await global._db('bus').where(busInfobj).first();
    var middleStationArr = busInfo.middleStation.split("|")
    var busdetail = {id:busInfo.id,favorite:0,busNo:busNo,startStation: busInfo.startStation,
      endStation: busInfo.endStation,middleStation:middleStationArr}
    const favorite = await global._db('favoriteBus').where({busNo:busNo,studentId:studentID}).first()
    if (favorite != undefined && favorite.id != 0) {
      busdetail.favorite = 1
    }
    return busdetail;
  }
  async favoriteSchoolBus(busNo,studentID) {
    const favoriteBusInfobj = { busNo: busNo,studentId:studentID };
    const favoriteBusInfo = await global._db('favoriteBus').where(favoriteBusInfobj).first();
    if (favoriteBusInfo == undefined) {
      let result = await global._db('favoriteBus').insert(favoriteBusInfobj);
      if (result === 0) {
        return { code: -1, message: '添加收藏错误' };
      }
    } else {
      let result = await global._db('favoriteBus').where(favoriteBusInfobj).del();
      if (result === 0) {
        return { code: -1, message: '取消收藏错误' };
      }
    }
    return favoriteBusInfo;
  }
}

function getSchoolBusTime(time) {
  var str = time.split(':');
  var hour = str[0]
  if (hour >= 6 && hour < 12) {
    return "上午"
  } else if (hour >= 12 && hour < 14) {
    return "中午"
  } else if (hour >= 14 && hour < 19) {
    return "下午"
  } else if (hour >= 19 && hour <= 21) {
    return "晚间"
  }
  return ""
}

const schoolbus = new SchoolBus();

module.exports = schoolbus;